<?php

namespace App\Services;

class InputFilter
{
    /**
     * 彻底清理输入，移除所有控制字符和编辑序列
     */
    public static function cleanInput($input)
    {
        if (empty($input)) {
            return '';
        }

        // 记录原始输入用于调试
        $original = $input;
        
        // 第一步：移除所有 Telnet IAC 序列 (0xFF 开头的序列)
        $step1 = self::removeTelnetIac($input);
        
        // 第二步：移除所有 ANSI 转义序列
        $step2 = self::removeAnsiSequences($step1);
        
        // 第三步：处理退格键和编辑序列
        $step3 = self::processBackspaces($step2);
        
        // 第四步：移除所有剩余的控制字符
        $step4 = self::removeAllControlChars($step3);
        
        // 第五步：只保留命令允许的字符
        $step5 = self::keepCommandCharsOnly($step4);
        
        // 调试信息
        echo "输入过滤过程:\n";
        echo "原始: " . bin2hex($original) . " -> '" . addcslashes($original, "\0..\37\177..\377") . "'\n";
        echo "清理后: '" . $step5 . "'\n";
        
        return $step5;
    }
    
    protected static function removeTelnetIac($input)
    {
        $output = '';
        $length = strlen($input);
        $i = 0;
        
        while ($i < $length) {
            $byte = ord($input[$i]);
            
            // 如果是 IAC (0xFF)，跳过整个序列
            if ($byte === 0xFF) {
                $i++; // 跳过 IAC 字节
                // 跳过命令字节
                if ($i < $length) {
                    $i++;
                }
            } else {
                $output .= $input[$i];
                $i++;
            }
        }
        
        return $output;
    }
    
    protected static function removeAnsiSequences($input)
    {
        // 移除所有 ANSI 转义序列
        return preg_replace('/\x1B\[[0-9;]*[a-zA-Z]|\x1B.[^\x1B]*\x1B\\\/', '', $input);
    }
    
    protected static function processBackspaces($input)
    {
        $result = '';
        $length = strlen($input);
        
        for ($i = 0; $i < $length; $i++) {
            $char = $input[$i];
            $ord = ord($char);
            
            // 如果是退格字符 (0x08)，删除前一个字符
            if ($ord === 0x08) {
                if (strlen($result) > 0) {
                    $result = substr($result, 0, -1);
                }
            } 
            // 如果是可打印字符，添加到结果
            elseif ($ord >= 32 && $ord <= 126) {
                $result .= $char;
            }
            // 忽略其他所有控制字符
        }
        
        return $result;
    }
    
    protected static function removeAllControlChars($input)
    {
        // 移除所有控制字符 (ASCII 0-31, 127)
        return preg_replace('/[\x00-\x1F\x7F]/', '', $input);
    }
    
    protected static function keepCommandCharsOnly($input)
    {
        // 只保留字母、数字、空格、下划线（用于命令）
        return preg_replace('/[^a-zA-Z0-9 _]/', '', $input);
    }
    
    /**
     * 从输入中提取命令和参数
     */
    public static function extractCommand($input)
    {
        $clean = self::cleanInput($input);
        
        if (empty($clean)) {
            return ['command' => '', 'arguments' => []];
        }
        
        $parts = preg_split('/\s+/', trim($clean));
        $command = strtolower(array_shift($parts));
        
        return [
            'command' => $command,
            'arguments' => $parts
        ];
    }
}